package slic.solicitudaltaalumno.receptores;

import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.List;

import javax.mail.internet.InternetAddress;

import slic.model.Escuela;
import slic.solicitudaltaalumno.EnvioSolicitudAltaAlumno;

import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.mail.MailMessage;

public class ReceptorPorMail implements ReceptorType {
	
	private static Log _log = LogFactoryUtil.getLog(ReceptorPorMail.class);
	
	private List<InternetAddress> destinos;
	private InternetAddress direccionOrigen;
	
	public ReceptorPorMail(List<InternetAddress> destinos) {
		this.destinos = destinos;
		String mailOrigen = "solicitudes@intercolegiales.sanluis.gov.ar";
		String nombreOrigen = "Solicitud de Alta de Alumnos - San Luis Intercolegiales 2013";
		try {
			direccionOrigen = new InternetAddress(mailOrigen, nombreOrigen);
		} catch (UnsupportedEncodingException e) {
			_log.trace("La direccion de origen no es valida", e);
			e.printStackTrace();
		}
	}
	
	private String getBody(EnvioSolicitudAltaAlumno solicitud) throws Exception {
		StringBuilder body = new StringBuilder();
		
		body.append("Se ha solicitado el alta de un alumno " + 
		            "al sistema de Juegos Intercolegiales 2013\n\n");
		if (solicitud.getSolicitante() != null) {
			body.append(String.format("Solicitado por: %s\n", solicitud.getSolicitante().getLastName()));
			body.append("\n");
		}
		body.append("Datos del alumno:\n");
		body.append("\n");
		body.append(String.format("DNI: %s\n", solicitud.getDni()));
		body.append(String.format("Nombre: %s\n", solicitud.getNombreCompleto()));
		Escuela escuela = solicitud.getEscuela();
		body.append(String.format("Escuela: %s (CUE: %s)\n", escuela.getNombre(), escuela.getCue()));
		String fechaNacimiento = new SimpleDateFormat("dd-MM-yyyy").format(solicitud.getFechaNacimiento());
		body.append(String.format("Fecha de Nacimiento: %s\n", fechaNacimiento));
		body.append(String.format("Nivel: %s", solicitud.getNivel()));
		
		return body.toString();
	}	
	
	private String getSubject(EnvioSolicitudAltaAlumno solicitud) {
		return String.format("Juegos Intercolegiales - Solicitud de alta de alumno - %s", solicitud.getDni()); 
	}
	
	private void sendMail(EnvioSolicitudAltaAlumno solicitud) {
	
		String subject = getSubject(solicitud);    
		String body;
		try {
			body = getBody(solicitud);
		} catch (Exception e1) {
			_log.trace("Error getting Mail Body", e1);
			return;
		}
	
		InternetAddress[] destinosArray = destinos.toArray(new InternetAddress[destinos.size()]);
        MailMessage mailMessage = new MailMessage();
        mailMessage.setFrom(direccionOrigen);
        mailMessage.setBody(body);
        mailMessage.setSubject(subject);
        mailMessage.setTo(destinosArray);
        
        _log.debug(String.format("Enviando mails a %s destinos", destinos.size()));
        
        MailServiceUtil.sendEmail(mailMessage);
        
	}
	
	@Override
	public void enviar(EnvioSolicitudAltaAlumno solicitud) {
		if (destinos.isEmpty()) {
			_log.warn("No hay mails configurados para enviar la solicitud de alta de alumno");	
		} else {
			sendMail(solicitud);
			_log.info(String.format("Mail de solicitud alta de alumno con DNI '%s' enviado", solicitud.getDni()));
		}
	}
	
}
